package com.example.administrator.exkotlin.base.empty

import com.example.administrator.exkotlin.base.`object`.IStudy

/**
 * kotlin判空操作
 * */
object EmptyEx {

    //java思维处理
    fun doSomthing_1(study: IStudy?) {
        if (study != null) {
            study.write("")
            study.read("")
        }
    }

    //java思维处理
    fun getNotEmpty_1(a: String?): Int {
        if (a != null) {
            return a.length
        }
        return 0
    }


    /**
     * 在参数类型后添加？则表明该参数可以为空
     * 使用？.操作符。表示当前对象不为空的时候正常调用，否则为空的时候什么都不做
     * */
    fun doSomthing(study: IStudy?) {
        study?.write("")
        study?.read("")
    }

    /**
     * ?:操作符
     *a?:b
     * 当左侧不为空就返回左侧，否则右侧不为空就返回右侧的结果
     * */
    fun getNotEmpty(a: String?) = a?.length ?: 0

    /**
     *有些时候我们已经做了非空的判断，但是kotlin还是会检测到我们有空的风险，因为它不知道我们已经做了判断
     * 因此我们可以使用！！强制执行编译
     * */
    fun forceNotEmpty() {
        var str: String? = "hello"
        if (str != null) {
            testNotEmpty(str)
        }

    }

    /**
     * !! 操作符编译，不考虑是否为空，确定一定不为空
     * */
    private fun testNotEmpty(str: String?) {
        str!!.toUpperCase()
    }

    /**
     * let函数，将对象本身传递到lambda表达中
     * 因此在之前只需要做一次?.来判空即可
     * */
    fun oneShotNotEmpty(study: IStudy?) {
        //这种方式有点啰嗦，相当于每次都进行了一次判断
        study?.write("")
        study?.read("")

        //let函数，将对象本身传递到lambda表达中 因此在之前只需要做一次?.来判空即可
        study?.let { study2->{
            study2.read("")
            study2.write("")
        } }

    }
}